#ifndef __CONNECTION_H__
#define __CONNECTION_H__

#include <boost/beast.hpp>
#include <boost/asio.hpp>
#include <boost/beast/core/stream_traits.hpp>
#include <boost/beast/websocket/stream.hpp>

#include <memory.h>
#include <memory>
#include <queue>
#include <thread>
#include <mutex>

class Connection : public std::enable_shared_from_this<Connection>
{
public:
    using ptr = std::shared_ptr<Connection>;
    /*
    boost::beast::tcp_stream 是一个封装了 TCP 连接的对象。
    它基于 Boost.Asio 库，提供了对 TCP 协议的支持。tcp_stream 
    主要用于处理底层的网络连接，包括连接的建立、数据的发送和接收等。
    */
    using tcp_stream = boost::beast::tcp_stream;
    /*
    基于 tcp_stream 的 WebSocket 客户端/服务器流对象。
    自动处理 WebSocket 协议的握手、帧分割、重组等细节，让开发者专注于业务逻辑的实现。
    */
    using stream = boost::beast::websocket::stream<tcp_stream>;
    using flat_buffer = boost::beast::flat_buffer;

    Connection(boost::asio::io_context& io_context);

    void start();
    void async_accept();
    void async_send(std::string&& data);
    void close();

    //返回连接的 uuid
    std::string uuid() const { return _uuid; }
    //返回底层 socket 对象
    boost::asio::ip::tcp::socket& socket() { return boost::beast::get_lowest_layer(*_ws_stream).socket(); }

private:
    std::unique_ptr<stream> _ws_stream;
    std::string _uuid;
    boost::asio::io_context& _io_context;
    flat_buffer _recv_buffer;
    std::queue<std::string> _send_queue;
    std::mutex _send_queue_lock;
};


#endif
